package com.fdb.smcts.core.constant;

/**
 * 通用返回码
 */
public enum CommonReturnCode {

    // *******************************************************
    // ** 说明：
    // ** 响应码类型：E：错误，S：成功
    // **
    // ** 信息类型：
    // ** M：表示数据信息/处理错误类
    // ** B：表示业务信息/处理错误类
    // ** S：表示系统信息/处理错误类
    // ** F：表示文件信息/处理错误类
    // ** D：表示数据库信息/处理错误类
    // ** Z：其他类别
    // *******************************************************
    /**
     * 成功
     */
    SUCCESS("S0A00000", "成功", true),

    // M：表示数据信息/处理错误类
    ERR_REST_INPUT_VALIDATION_REJECTED("M0001", "输入参数有误"),
    ERR_ILLEGAL_HTTP_REQUEST("M0002", "非法的HTTP请求"),
    ERR_ILLEGAL_OPEN_ID("M0003", "无效的openId"),
    ERR_ILLEGAL_MOBILE_IN("M0004", "手机号码重复"),

    // B：表示业务信息/处理错误类
    /**基础配置模块异常定义 start*/
    ERR_CFG_SERVICE_EXCEPTION("B0001", "基础配置服务出现异常"),
    /**基础配置模块异常定义 end*/
    
    /**产品模块异常定义 start*/
    ERR_PRD_SERVICE_EXCEPTION("B1001", "产品服务出现异常"),
    /**产品模块异常定义 end*/
    
    /**客户模块异常定义 start*/
    ERR_CUS_SERVICE_EXCEPTION("B2001", "客户服务出现异常"),
    /**客户模块异常定义 end*/
    
    /**额度模块异常定义 start*/
    ERR_LIMIT_SERVICE_EXCEPTION("B3001", "额度服务出现异常"),
    /**产品模块异常定义 end*/
    
    /**合同模块异常定义 start*/
    ERR_CTR_SERVICE_EXCEPTION("B4001", "合同服务出现异常"),
    /**合同模块异常定义 end*/
    
    /**借据模块异常定义 start*/
    ERR_LOAN_SERVICE_EXCEPTION("B5001", "借据服务出现异常"),
    /**借据模块异常定义 end*/
    
    /**风控模块异常定义 start*/
    ERR_RISK_SERVICE_EXCEPTION("B6001", "风控服务出现异常"),
    /**风控模块异常定义 end*/

    // S：表示系统信息/处理错误类
    ERR_SERVICE_NETWORK_EXCEPTION("S0001", "内部网络异常访问核心业务失败"),
    ERR_SERVICE_WAIT_HANDLING_TIMEOUT("S0002", "等待核心业务处理超时"),
    ERR_SERVICE_FORBIDDEN_EXCEPTION("S0003", "核心业务不可用"),
    ERR_SERVICE_UNKNOWN_EXCEPTION("S0004", "系统繁忙，核心业务暂时不可用"),

    // Z：其他类别
    ERR_IBM_FRAMEWORK_ERROR("Z0001", "IBM系统框架错误"),
    ERR_IO_PRINT_EXCEPTION("Z0002", "IO输出异常"),
    ERR_UNKNOWN_ERROR("Z1999", "系统繁忙，请稍后再试"),
    ;

    // 积分Restful应用的错误码范围0001~1999
    private static final int MIN_ERR_NUMBER = 1;
    private static final int MAX_ERR_NUMBER = 1999;
    private static final String CURRENT_APP_SYSTEM_ID = "T24";
    private String code;
    private String msg;

    CommonReturnCode(String errCodeRightPart, String returnDesc) {
        if (errCodeRightPart.length() != 5) {
            throw new IllegalArgumentException("根据规范，返回码只有后5位是可定义的部分");
        }

        /**
         * M：表示数据信息/处理错误类 <br>
         * B：表示业务信息/处理错误类 <br>
         * S：表示系统信息/处理错误类 <br>
         * F：表示文件信息/处理错误类 <br>
         * D：表示数据库信息/处理错误类 <br>
         * Z：其他类别
         */
        char errType = errCodeRightPart.charAt(0);
        switch (errType) {
        case 'M':
        case 'B':
        case 'S':
        case 'F':
        case 'D':
        case 'Z':
            break;
        default:
            throw new IllegalArgumentException("根据规范，返回码倒数第5位为字母表示错误类型，目前有M、B、S、F、D、Z");
        }

        String errNumStr = errCodeRightPart.substring(1, 5);
        if (!errNumStr.matches("[0-9]{4}")) {
            throw new IllegalArgumentException("根据规范，返回码后4位必须为数字");
        }
        int errNum = Integer.parseInt(errNumStr);
        if (errNum < MIN_ERR_NUMBER || errNum > MAX_ERR_NUMBER) {
            throw new IllegalArgumentException("应用定义错误码后4位必须介于0001~" + MAX_ERR_NUMBER + "这个范围");
        }

        this.code = "E" + CURRENT_APP_SYSTEM_ID + errCodeRightPart;
        this.msg = returnDesc;
    }

    CommonReturnCode(String fullReturnCode, String returnDesc, boolean isSuccessReturnCode) {
        this.code = fullReturnCode;
        this.msg = returnDesc;
    }

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public boolean isSuccess() {
        return SUCCESS.code.equals(code);
    }

}
